package Gestor;

import Clases.AdelantoAguinaldo;
import java.sql.Date;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.HibernateException;

public class GestorAdelantoAguinaldo extends GestorBase {

    private static GestorAdelantoAguinaldo instancia = null;
    private static final String ADELANTOS_HISTORICOS = "SELECT alias.idAdelanto FROM (SELECT sistemaplanilla.adelanto_aguinaldo.idAdelanto FROM sistemaplanilla.adelanto_aguinaldo INNER JOIN sistemaplanilla.empleado ON sistemaplanilla.adelanto_aguinaldo.numEmpleado=sistemaplanilla.empleado.numEmpleado WHERE sistemaplanilla.adelanto_aguinaldo.fecha between :fechaInicio and :fechaFin AND sistemaplanilla.empleado.numEmpleado=:num AND sistemaplanilla.empleado.fechaFin is not null)alias";

    private GestorAdelantoAguinaldo() {

    }

    @Override
    public Object insertar(Object adelanto) {
        long exito = 0;
        try {
            iniciaOperacion();
            Object bn = sesion.save(adelanto);
            tx.commit();
            exito = 1;
        } catch (HibernateException he) {
            manejaExcepcion(he);
        } finally {
            sesion.close();
        }
        return exito;
    }

    public static GestorAdelantoAguinaldo obtenerInstancia() {
        if (instancia == null) {
            instancia = new GestorAdelantoAguinaldo();
        }
        return instancia;
    }

    public ArrayList<AdelantoAguinaldo> getAdelantos() {
        ArrayList<AdelantoAguinaldo> adelantos = new ArrayList<AdelantoAguinaldo>();
        try {
            iniciaOperacion();
            List adelantosTemp = sesion.createSQLQuery("select * from "
                    + "adelanto_aguinaldo where fecha > STR_TO_DATE(CONCAT(YEAR(CURDATE()),'-',1,'-',1),'%Y-%m-%d')").list();
            if (adelantosTemp != null) {
                for (int i = 0; i < adelantosTemp.size(); i++) {
                    adelantos.add(AdelantoAguinaldo.fromArray((Object[]) adelantosTemp.get(i)));
                }
            }
        } finally {
            sesion.close();
        }
        return adelantos;
    }

    public ArrayList<AdelantoAguinaldo> getAdelantosEmpleado(Long numEmpleado) {
        ArrayList<AdelantoAguinaldo> adelantos = new ArrayList<AdelantoAguinaldo>();
        try {
            iniciaOperacion();
            List adelantosTemp = sesion.createSQLQuery("select * from "
                    + "adelanto_aguinaldo where fecha > STR_TO_DATE(CONCAT(YEAR(CURDATE()),'-',1,'-',1),'%Y-%m-%d') AND numEmpleado=:?")
                    .setParameter("?", numEmpleado)
                    .list();
            if (adelantosTemp != null) {
                for (int i = 0; i < adelantosTemp.size(); i++) {
                    adelantos.add(AdelantoAguinaldo.fromArray((Object[]) adelantosTemp.get(i)));
                }
            }
        } finally {
            sesion.close();
        }
        return adelantos;
    }

    public ArrayList<java.math.BigInteger> getAdelantosEmpleadoHistoricos(Long numEmpleado, Date fechaPagoInicio, Date fechaPagoFin) {
        ArrayList<java.math.BigInteger> listaAdelantos = null;
        try {
            iniciaOperacion();
            listaAdelantos = (ArrayList<java.math.BigInteger>) sesion.createSQLQuery(ADELANTOS_HISTORICOS)
                    .setParameter("fechaInicio", fechaPagoInicio)
                    .setParameter("fechaFin", fechaPagoFin)
                    .setParameter("num", numEmpleado)
                    .list();
        } finally {
            sesion.close();
        }
        return listaAdelantos;
    }

    public AdelantoAguinaldo getAdelantoPorId(int id) throws HibernateException {
        AdelantoAguinaldo adelanto = null;
        try {
            iniciaOperacion();
            adelanto = (AdelantoAguinaldo) sesion.get(AdelantoAguinaldo.class, id);
        } finally {
            sesion.close();
        }

        return adelanto;
    }
}
